package com.wkr.dao;


import com.wkr.bean.product;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.hibernate.Transaction;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.orm.hibernate5.HibernateTemplate;
import org.springframework.stereotype.Repository;
import org.springframework.transaction.annotation.Transactional;

import java.io.Serializable;
import java.util.List;

@Repository
@Transactional
public class testDao  {

   @Autowired
   HibernateTemplate hibernateTemplate;

    public int getAll() {
        SessionFactory sessionFactory = hibernateTemplate.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        List<product> productList = session.createQuery("from product").list();
        return productList.size();
    }

    /**
     * 每次查询从索引位置开始找MaxSize数条记录
     * @param startIndex 开始的索引
     * @param maxSize 单页最大记录数
     * @return
     */
    public List<product> getItems(int startIndex, int maxSize) {
        SessionFactory sessionFactory = hibernateTemplate.getSessionFactory();
        Session session = sessionFactory.getCurrentSession();
        List<product> productList = session.createQuery("from product").setFirstResult(startIndex).setMaxResults(maxSize).list();
        return  productList;
    }

    public void save (product p) {

        /**
         * 通过session的方式 需要自己手动开启事务  spring的事务管理配置到达不了session层
         */
        SessionFactory sessionFactory = hibernateTemplate.getSessionFactory();
        Session session = sessionFactory.openSession();
        Transaction transaction = session.beginTransaction();
        try {
            session.saveOrUpdate(p);
        } catch (Exception e) {
            transaction.rollback();
        } finally {
            transaction.commit();
            session.close();
        }

        /**
         * 这个直接可以通过事务注解的方式配置
         */
//        Serializable serializable = hibernateTemplate.save(p);
//        System.out.println(serializable);
    }

    public product findone() {
        product p = new product();
        p.setpID(1);
        //二级缓存  自己手动创建session来查找的话 无法与其他session实现共享不能实现二级缓存
        List<product> list = hibernateTemplate.findByExample(p);
        hibernateTemplate.setCacheQueries(true);
        return list.get(0);
    }

}
